home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cpp_libs
/
answrbok
/
4_10.lha
/
4_10
/
4_10b.c
< prev
next >
Wrap
Text File
|
1993-08-08
|
1KB
|
66 lines
* Copyright (c) 1990 by AT&T Bell Telephone Laboratories, Incorporated. */
* The C++ Answer Book */
* Tony Hansen */
* All rights reserved. */
ifndef VER2 /* DELETE */
include "4_10b0.c" /* DELETE */
else /* DELETE */
include "4_10c.c" /* DELETE */
endif /* DELETE */
/ invert A and place the result in I
nt matinv(double **A, double **I, int nelem)
// initialize identity matrix I
for (int i = 0; i < nelem; i++)
{
for (int j = 0; j < nelem; j++)
I[i][j] = 0.0;
I[i][i] = 1.0;
}
// loop diag from 0 to nelem-1
for (int diag = 0; diag < nelem; diag++)
{
if (!dopivot(A, I, diag, nelem))
return 0;
// divide row diag by A[diag][diag] in A and I
// ignore A[diag][0..diag-1] since they
// are already 0
double div = A[diag][diag];
if (div != 1.0)
{
A[diag][diag] = 1.0;
for (int j = diag+1; j < nelem; j++)
A[diag][j] /= div;
for (j = 0; j < nelem; j++)
I[diag][j] /= div;
}
// loop i from 0 to diag-1 and
// from diag+1 to nelem-1
for (i = 0; i < nelem; i++)
{
if (i == diag)
continue;
// subtract A[i][diag] * row diag
// from row i in A and I
double sub = A[i][diag];
if (sub != 0.0)
{
A[i][diag] = 0.0;
for (int j = diag+1; j < nelem; j++)
A[i][j] -= sub * A[diag][j];
for (j = 0; j < nelem; j++)
I[i][j] -= sub * I[diag][j];
}
}
}
return 1;